Update RTCPeerConnection-setRemoteDescription.html to spec, and avoid hang-prone test_state_change_event(). bugzilla-url: https://bugzilla.mozilla.org/show_bug.cgi?id=1461563 gecko-commit: 1d34216b7f19e85e28b52d5e900b5c0a0d9728bb gecko-integration-branch: autoland gecko-reviewers: bwc
diff --git a/webrtc/RTCPeerConnection-setRemoteDescription.html b/webrtc/RTCPeerConnection-setRemoteDescription.html index 2efd301..3ceafe0 100644 --- a/webrtc/RTCPeerConnection-setRemoteDescription.html +++ b/webrtc/RTCPeerConnection-setRemoteDescription.html
@@ -11,11 +11,8 @@ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html // The following helper functions are called from RTCPeerConnection-helper.js: - // generateOffer() - // generateAnswer() // assert_session_desc_not_equals() // assert_session_desc_equals() - // test_state_change_event() /* 4.3.2. Interface Definition @@ -48,76 +45,101 @@ /* 4.6.1. enum RTCSdpType */ - promise_test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); // SDP is validated after WebIDL validation - return promise_rejects(t, new TypeError(), - pc.setRemoteDescription({ - type: 'bogus', - sdp: 'bogus' - })); + try { + await pc.setRemoteDescription({ type: 'bogus', sdp: 'bogus' }); + t.unreached_func("Should have rejected."); + } catch (e) { + assert_throws(new TypeError(), () => { throw e }); + } }, 'setRemoteDescription with invalid type and invalid SDP should reject with TypeError'); - promise_test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); // SDP is validated after validating type - return promise_rejects(t, 'InvalidStateError', - pc.setRemoteDescription({ - type: 'answer', - sdp: 'invalid' - })); + try { + await pc.setRemoteDescription({ type: 'answer', sdp: 'invalid' }); + t.unreached_func("Should have rejected."); + } catch (e) { + assert_throws('InvalidStateError', () => { throw e }); + } }, 'setRemoteDescription() with invalid SDP and stable state should reject with InvalidStateError'); + /* Dedicated signalingstate events test. */ + + promise_test(async t => { + const pc = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + t.add_cleanup(() => pc2.close()); + + let eventCount = 0; + const states = [ + 'stable', 'have-local-offer', 'stable', 'have-remote-offer', 'closed' + ]; + pc.onsignalingstatechange = () => + assert_equals(pc.signalingState, states[++eventCount]); + + const assert_state = state => { + assert_equals(state, pc.signalingState); + assert_equals(state, states[eventCount]); + }; + + const offer = await pc.createOffer({ offerToReceiveAudio: true }); + assert_state('stable'); + await pc.setLocalDescription(offer); + assert_state('have-local-offer'); + await pc2.setRemoteDescription(offer); + await pc2.setLocalDescription(await pc2.createAnswer()); + await pc.setRemoteDescription(pc2.localDescription); + assert_state('stable'); + await pc.setRemoteDescription(await pc2.createOffer()); + assert_state('have-remote-offer'); + pc.close(); + assert_state('closed'); + }, 'Negotiation should fire signalingsstate events'); + /* Operations after returning to stable state */ - promise_test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + t.add_cleanup(() => pc2.close()); - test_state_change_event(t, pc, - ['have-remote-offer', 'stable', 'have-remote-offer']); - - return pc2.createOffer({ offerToReceiveAudio: true }) - .then(offer1 => - pc.setRemoteDescription(offer1) - .then(() => pc.createAnswer()) - .then(answer => pc.setLocalDescription(answer)) - .then(() => pc2.createOffer({ offerToReceiveVideo: true })) - .then(offer2 => { - return pc.setRemoteDescription(offer2) - .then(() => { - assert_equals(pc.signalingState, 'have-remote-offer'); - assert_session_desc_not_equals(offer1, offer2); - assert_session_desc_equals(pc.remoteDescription, offer2); - assert_session_desc_equals(pc.currentRemoteDescription, offer1); - assert_session_desc_equals(pc.pendingRemoteDescription, offer2); - }); - })); + const offer1 = await pc2.createOffer({ offerToReceiveAudio: true }); + await pc.setRemoteDescription(offer1); + await pc.setLocalDescription(await pc.createAnswer()); + const offer2 = await pc2.createOffer({ offerToReceiveVideo: true }); + await pc.setRemoteDescription(offer2); + assert_session_desc_not_equals(offer1, offer2); + assert_session_desc_equals(pc.remoteDescription, offer2); + assert_session_desc_equals(pc.currentRemoteDescription, offer1); + assert_session_desc_equals(pc.pendingRemoteDescription, offer2); }, 'Calling setRemoteDescription() again after one round of remote-offer/local-answer should succeed'); - promise_test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + t.add_cleanup(() => pc2.close()); - test_state_change_event(t, pc, - ['have-local-offer', 'stable', 'have-remote-offer']); - - return pc.createOffer({ offerToReceiveAudio: true }) - .then(offer => - pc.setLocalDescription(offer) - .then(() => generateAnswer(offer))) - .then(answer => - pc.setRemoteDescription(answer) - .then(() => generateOffer({ pc, data: true })) - .then(offer => - pc.setRemoteDescription(offer) - .then(() => { - assert_equals(pc.signalingState, 'have-remote-offer'); - assert_session_desc_equals(pc.remoteDescription, offer); - assert_session_desc_equals(pc.currentRemoteDescription, answer); - assert_session_desc_equals(pc.pendingRemoteDescription, offer); - }))); + const offer = await pc.createOffer({ offerToReceiveAudio: true }); + await pc.setLocalDescription(offer); + await pc2.setRemoteDescription(offer); + const answer = await pc2.createAnswer(); + await pc2.setLocalDescription(answer); + await pc.setRemoteDescription(answer); + await pc.setRemoteDescription(await pc2.createOffer()); + assert_equals(pc.remoteDescription.sdp, pc.pendingRemoteDescription.sdp); + assert_session_desc_equals(pc.remoteDescription, offer); + assert_session_desc_equals(pc.currentRemoteDescription, answer); }, 'Switching role from offerer to answerer after going back to stable state should succeed'); /*